#ifndef _PROCESS_H_
#define _PROCESS_H_

#define PROC_NAME 20

#include "kc.h"

//estados en los que se puede encontrar un proceso
typedef enum {BLOCKED, READY, RUNNING, DEAD} procState;

//si el proceso esta bloqueado, esto indica en que estado
typedef enum {B_READ = 1, B_WAIT, B_ASLEEP} blocState;

//definicion de los punteros a funcion para los procesos
typedef int (*processFunc)(int,char**);

int init(int argc, char* argv[]);

#include "fileSystem/fileDescriptor.h"

typedef struct process
{
	int pid;
	char name[PROC_NAME];
	unsigned char priority;
	char tty;
	char background;
	procState state;	//estado en el que se encuentra el proceso
	blocState block;	//estado de bloqueo
	int waitPid;		//si esta en B_WAIT, esto indica el pid que lo desperto
	void * ESP;
	void * stackStart;
	int stackLen;
	int indexSiblings;
	int indexChild;
	int indexParent;
	inodeTableEntry * rootDir;	//inodo del directorio root
	inodeTableEntry * currDir;	//inodo del directorio actual
	fileDes_t fd[FD_PER_PROC];	//tabla de file descriptors
	char cpuUsage;
	int tics;
}process_t;

typedef struct
{
	int pid;
	char name[PROC_NAME];
	unsigned char priority;
	char tty;
	char background;
	procState state;	//estado en el que se encuentra el proceso
	blocState block;	//estado de bloqueo
	char cpuUsage;
}process_info_t;


typedef struct
{
	int EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX,  EIP, CS, EFLAGS;
	void * retaddr;
	int argc;
	char ** argv;
}stackFrame_t;


#endif
